/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.resume.contrat.builder;

import java.util.List;

import org.apache.commons.collections.CollectionUtils;

import fr.generali.accueilclient.contrat.builder.IConsultContratBuilder;
import fr.generali.accueilclient.contrat.om.IConsultContrat;
import fr.generali.accueilclient.contrat.om.impl.ConsultContrat;
import fr.generali.accueilclient.resume.contrat.om.IResumeContrat;
import fr.generali.accueilclient.resume.contrat.om.IRole;
import fr.generali.accueilclient.utils.constantes.CodeRoleEnum;

/**
 * @author Holmes Kelly
 */
public class IResumeContrat2IConsultContrat implements IConsultContratBuilder {

    /**
     * 
     */
    private IConsultContrat consultContrat;

    /**
     * 
     */
    private IResumeContrat contrat;

    /**
     * @param contrat resume contrat
     */
    public IResumeContrat2IConsultContrat(IResumeContrat contrat) {
        consultContrat = new ConsultContrat();
        this.contrat = contrat;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildNumeroContrat() {
        consultContrat.setNumeroContrat(contrat.getNumeroContrat());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildSystemeOrigine() {
        consultContrat.setSystemeOrigine(contrat.getSystemOrigine());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildSocieteDuGroupe() {
        consultContrat.setSocieteDuGroupe(contrat.getCodeCompagnie());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildCodeProduit() {
        consultContrat.setCodeProduit(contrat.getCodeProduit());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildCategorieStatistique() {
        consultContrat.setCategorieStatistique(contrat.getCodeProduit());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildCodeSituation() {
        consultContrat.setCodeSituation(contrat.getStatut());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildModePrelevement() {
        consultContrat.setModePrelevement(contrat.getModePaiement());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildNatureRecouvrement() {
        consultContrat.setNatureRecouvrement(contrat.getNatureRecouvrement());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildLibelleModePrelevement() {
        consultContrat.setLibelleModePrelevement(getLibelleRecouvrement(contrat.getModePaiement(),
                        contrat.getNatureRecouvrement()));

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildNumOrdreRIB() {
        if (CollectionUtils.isNotEmpty(contrat.getCoordonneesBancaires())) {
            consultContrat.setNumOrdreRIB(contrat.getCoordonneesBancaires().get(0).getNumOrdre());
        }

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildIdentifiantRIB() {
        if (CollectionUtils.isNotEmpty(contrat.getCoordonneesBancaires())) {
            consultContrat.setIdentifiantRIB(contrat.getCoordonneesBancaires().get(0).getIdentifiant());
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildNumOrdreAdresse() {
        if (contrat.getAdresse() != null) {
            consultContrat.setNumOrdreAdresse(contrat.getAdresse().getNumOrdre());
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildAdresseSelected() {
        consultContrat.setAdresseSelected(false);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildRibSelected() {
        consultContrat.setRibSelected(false);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildPropag() {

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildSouscripteur() {
        consultContrat.setSouscripteur(getRoles(contrat.getRoles(), CodeRoleEnum.ROLE_SOUSCRIPTEUR.getCodeRole()));
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildPayeur() {
        consultContrat.setPayeur(getRoles(contrat.getRoles(), CodeRoleEnum.ROLE_PAYEUR.getCodeRole()));
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public IConsultContrat getConsultContrat() {

        return consultContrat;
    }

    /**
     * on recupere le numero client du souscripteur ou du payeur
     * 
     * @param listeRoles la liste des roles du contrat
     * @param typeRole S pour souscripteur ou P pour payeur
     * @return le numero client du souscripteur ou du payeur
     */
    private String getRoles(List<IRole> listeRoles, String typeRole) {
        String numClient = null;

        for (IRole role : listeRoles) {
            if (role != null && role.getRole().equalsIgnoreCase(typeRole)) {
                return role.getNumeroClient();
            }
        }

        return numClient;
    }

    /**
     * Renvoie le libelle recouvrement via le mode recouvrement et la nature
     * recouvrement
     * 
     * @param modeRecouvrement mode recouvrement
     * @param natureRecouvrement nature recouvrement
     * @return le libelle recouvrement
     */
    private String getLibelleRecouvrement(String modeRecouvrement, String natureRecouvrement) {

        String libelle = null;

        if (CHAINE_3.equals(modeRecouvrement) && CHAINE_1.equals(natureRecouvrement)) {
            libelle = PRELEVEMENT_COMPAGNIE;
        } else if (CHAINE_3.equals(modeRecouvrement) && CHAINE_2.equals(natureRecouvrement)) {
            libelle = PRELEVEMENT_AGENCE;
        } else if (CHAINE_6.equals(modeRecouvrement) && CHAINE_1.equals(natureRecouvrement)) {
            libelle = PAIEMENT_PAR_TIP_SIEGE;
        } else if (CHAINE_6.equals(modeRecouvrement) && CHAINE_2.equals(natureRecouvrement)) {
            libelle = PAIEMENT_PAR_TIP_AGENCE;
        }

        return libelle;
    }

}
